package com.smart.community.complaint.entity;

import com.baomidou.mybatisplus.annotation.*;
import com.smart.community.commons.base.BaseEntity;
import com.smart.community.commons.enums.SystemStatusEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.time.LocalDateTime;

/**
 * 投诉建议实体类
 * 
 * @author Wu.Liang
 * @version 1.0.0
 * @since 2025-06-26
 */
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sc_complaint")
public class Complaint extends BaseEntity {

    /**
     * 投诉编号
     */
    @TableField("complaint_no")
    private String complaintNo;

    /**
     * 用户ID
     */
    @TableField("user_id")
    private Long userId;

    /**
     * 居民ID
     */
    @TableField("resident_id")
    private Long residentId;

    /**
     * 社区ID
     */
    @TableField("community_id")
    private Long communityId;

    /**
     * 投诉标题
     */
    @TableField("title")
    private String title;

    /**
     * 投诉内容
     */
    @TableField("content")
    private String content;

    /**
     * 投诉描述
     */
    @TableField("complaint_content")
    private String complaintContent;

    /**
     * 投诉分类编码
     */
    @TableField("category_code")
    private String categoryCode;

    /**
     * 投诉位置
     */
    @TableField("complaint_location")
    private String complaintLocation;

    /**
     * 投诉类型
     */
    @TableField("complaint_type")
    private Integer complaintType;

    /**
     * 投诉级别
     */
    @TableField("complaint_level")
    private Integer complaintLevel;

    /**
     * 紧急程度
     */
    @TableField("urgency_level")
    private Integer urgencyLevel;

    /**
     * 投诉人ID
     */
    @TableField("complainant_id")
    private Long complainantId;

    /**
     * 投诉人姓名
     */
    @TableField("complainant_name")
    private String complainantName;

    /**
     * 投诉人电话
     */
    @TableField("complainant_phone")
    private String complainantPhone;

    /**
     * 联系电话
     */
    @TableField("contact_phone")
    private String contactPhone;

    /**
     * 是否匿名投诉：0-否，1-是
     */
    @TableField("is_anonymous")
    private Integer isAnonymous;

    /**
     * 状态
     */
    @TableField("status")
    private Integer status;

    /**
     * 处理状态
     */
    @TableField("handle_status")
    private Integer handleStatus;

    /**
     * 处理人ID
     */
    @TableField("handler_id")
    private Long handlerId;

    /**
     * 处理人姓名
     */
    @TableField("handler_name")
    private String handlerName;

    /**
     * 分配给
     */
    @TableField("assign_to")
    private Long assignTo;

    /**
     * 提交时间
     */
    @TableField("submit_time")
    private LocalDateTime submitTime;

    /**
     * 分配时间
     */
    @TableField("assign_time")
    private LocalDateTime assignTime;

    /**
     * 处理时间
     */
    @TableField("handle_time")
    private LocalDateTime handleTime;

    /**
     * 期望解决时间
     */
    @TableField("expected_solve_time")
    private LocalDateTime expectedSolveTime;

    /**
     * 实际解决时间
     */
    @TableField("actual_solve_time")
    private LocalDateTime actualSolveTime;

    /**
     * 回访时间
     */
    @TableField("followup_time")
    private LocalDateTime followupTime;

    /**
     * 处理步骤
     */
    @TableField("process_step")
    private String processStep;

    /**
     * 处理结果
     */
    @TableField("handle_result")
    private String handleResult;

    /**
     * 解决方案
     */
    @TableField("solution")
    private String solution;

    /**
     * 回访结果
     */
    @TableField("followup_result")
    private String followupResult;

    /**
     * 满意度
     */
    @TableField("satisfaction")
    private Integer satisfaction;

    /**
     * 满意度评分
     */
    @TableField("satisfaction_rating")
    private Integer satisfactionRating;

    /**
     * 图片列表（JSON格式）
     */
    @TableField("images")
    private String images;

    /**
     * 备注
     */
    @TableField("remark")
    private String remark;

    /**
     * 获取是否匿名投诉的布尔值
     * 
     * @return 是否匿名投诉
     */
    public Boolean getIsAnonymousBoolean() {
        return isAnonymous != null && isAnonymous == 1;
    }

    /**
     * 设置是否匿名投诉的布尔值
     * 
     * @param isAnonymous 是否匿名投诉
     */
    public void setIsAnonymousBoolean(Boolean isAnonymous) {
        this.isAnonymous = isAnonymous != null && isAnonymous ? 1 : 0;
    }

    /**
     * 检查是否超时
     * 
     * @return 是否超时
     */
    public boolean isTimeout() {
        // 只有待处理和处理中的投诉才计算超时
        if (expectedSolveTime == null || status == null) {
            return false;
        }
        
        if (status == 1 || status == 2) {
            LocalDateTime now = LocalDateTime.now();
            return now.isAfter(expectedSolveTime);
        }
        
        return false;
    }

    /**
     * 检查是否可以处理
     * 
     * @return 是否可以处理
     */
    public boolean canHandle() {
        return status != null && (status == 1 || status == 2);
    }

    /**
     * 检查是否可以关闭
     * 
     * @return 是否可以关闭
     */
    public boolean canClose() {
        return status != null && status == 3;
    }

    /**
     * 检查是否可以回访
     * 
     * @return 是否可以回访
     */
    public boolean canFollowup() {
        return status != null && status == 3 && satisfactionRating == null;
    }

    /**
     * 检查是否可以重开
     * 
     * @return 是否可以重开
     */
    public boolean canReopen() {
        return status != null && status == 4;
    }

    /**
     * 检查是否可以更新
     * 
     * @return 是否可以更新
     */
    public boolean canUpdate() {
        return status != null && (SystemStatusEnum.isEnabled(status) || SystemStatusEnum.isLocked(status));
    }

    /**
     * 检查是否处于活动状态
     * 
     * @return 是否活动
     */
    public boolean isActive() {
        return status != null && (SystemStatusEnum.isEnabled(status) || SystemStatusEnum.isLocked(status));
    }
}
